package com.centriole.common.component;

import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;

import java.net.MalformedURLException;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 *  功   能：Eureka客户端工具类,可以动态获取别的服务节点信息
 *  创建人：陈默晗
 *  时   间：2018年3月22日下午3:40:18
 */
@Component
public class EurekaClientUtils {

    public static DiscoveryClient discoveryClient;

    public static String getServiceUrlByRamdon(String serviceId){
        return getServiceUrlByRamdon( serviceId , null);
    }

    /**
     * 指定服务id，随机获取该服务集群中的1个实体的url
     * @param serviceId 服务id
     * @param defaultUrl 默认url
     * @return     形如这个样子的字符串：http://192.168.1.1:1234
     */
    public static String getServiceUrlByRamdon(String serviceId , String defaultUrl){
        if(discoveryClient == null) {
            discoveryClient = SpringUtils.getBean(DiscoveryClient.class);
        }
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);

        //如果没有任何实例，返回""
        if(instances.size() == 0 ) return "";

        int ramdonIndex = 0;
        //如果只有1个实例就直接 拿到url 返回了
        if(instances.size() > 1){
            //超过1个实例，就随机拿其中的1个url 返回
             ramdonIndex = new Random().nextInt(instances.size()-1);
        }

        String url = null;
        try {
             url = instances.get(ramdonIndex).getUri().toURL().toString();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        return StringUtils.isBlank(url)?defaultUrl:url;
    }

    /**
     * 拼接url
     * @param host  主机名
     * @param port  端口号
     * @return  形如这个样子的字符串：http://192.168.1.1:1234
     */
    private static String combineUrl(String host,int port){
        return ("http://"+host +":"+port+"/").replace(" ","");
    }
}
